@echo off&setlocal enabledelayedexpansion
::控制台转uft8
mode con: cols=60 lines=29&CHCP 65001&cls
::
:: 实现adb局域网无线调试
:: 原理:使用adb tcpip和adb connect指令
:: https://developer.android.google.cn/studio/command-line/adb
::说明:
::  实际上,只要首次成功设置[设备端口号]后,就可以断开USB了,
::  该设备在下次重启前(或长时间内??)都不会因为重连局域网,重启PC端adb等操作受影响,可以随时[adb connect]进行连接
::  存在安全隐患!!!所以建议修改私有的port

:: 此处改配置(按需修改)!!!
:: 如果adb无加入环境变量,则需要在此处配置adbHome
set adbHome="E:\AndroidSdk\platform-tools\"
:: ip段,实现只输入ip末尾就连接设备
set "ipHead=192.168.1."
:: adb端口号,默认是5555,按需修改
set "port=5555"

::全部入参:启动时自动连接的ip,用逗号相隔
set "targetIps="

::将所有参数拼到targetIps里;然后跳到main方法
:getInputParam
    ::%~n1:如果入参是文件,则只取文件名;如果不是文件,则等同于%1
    set "param=%~n1"
    ::已无入参,则跳转到main
    if "%param%"=="" goto main

    ::echo 追加入参="%param%"
    if not defined targetIps (
        set "targetIps=%param%"
    ) else (
        set "targetIps=%targetIps%,%param%"
    )
    ::偏移入参index,递归获取余下入参
    shift /0
    goto getInputParam

:main
    if defined targetIps echo 即将自动连接ip="%targetIps%"

	echo =========adb局域网无线调试=========
	echo   ^< (多个)USB连接设备 → 输入ip → ^>
	echo   ^< 无线连接成功/失败 → 拔出USB设备 ^>
	echo     (直接拖拽文件(夹)作为入参来运行bat,
	echo      则自动连接目标ip,ip=文件名)
	echo   ^< 设备ip段=%ipHead%xxx (按需修改)
    echo   ^< adb端口号=%port%, 默认为5555(按需修改)
	echo ========= =========

	::查找adb
	call :checkAdb

	::启动/重启adb
	::call :restartAdb

	::连接设备
	call :connectDevice
	exit

:connectDevice
    adb devices
    echo 请确保已连接USB设备
    if not defined targetIps (
        if not defined ips (
            set /p ips="< 请输入设备的ip(可多个,用','相隔)::"
        ) else (
            set /p ips="< 请输入设备的ip(省缺为[%ips%])::"
        )
        echo.
    ) else (
        ::有入参,直接自动开始连接
        set "ips=%targetIps%"
        set "targetIps="
    )

    ::更新已连接的USB设备的adb端口号
    for /f "tokens=1 skip=1" %%i in ('adb devices ^|findstr "device" ') do (
        set "sid=%%i"
        echo !sid!|findstr ":">nul
        if "!errorlevel!"=="0" (
            rem echo 含有":",是无线设备,不处理
        ) else (
            echo ^< 正在更新 [!sid!] 的端口号 ^>
            adb -s !sid! tcpip !port!
        )
    )

    ::遍历ips,进行连接
    echo.
    for %%i in (%ips%) do (
        set "ip=%%i"
        echo ^< 正在连接 !ipHead!!ip!...如果等待太久则一般是连接失败 ^>
        ::无线连接设备
        adb connect !ipHead!!ip!:!port!
        ::用adb devices判断执行结果:因为adb指令无法使用errorlevel等判断执行结果
        adb devices|findstr "!ipHead!!ip!:!port!">nul
        ::只要有一个连接失败,就break并跳回ips赋值节点
        if !errorlevel! neq 0 (
            color e0
            echo ^< 连接失败&echo.
            goto connectDevice
        )
    )
    ::所有ip都连接成功,才到达此处
    color b0
    echo.
    ::延迟一下,否则设备列表会显示offline,实际是在线的;但仍然偶然会显示不准确的offline
    choice /c 0 /d 0 /t 1 >nul
    adb devices
    echo ^< 如果状态是unauthorized,offline等,请自行排查.
    echo ^< 连接成功:请拔出设备 任意键退出...
    pause>nul
    exit

:restartAdb
	echo ^< 正在重启adb
	::adb无启动时,会显示错误信息,不影响功能
	adb kill-server
	adb start-server
	echo.
    goto :eof

::查找adb
:checkAdb
	::用户配置了adbHome,则cd到adbHome
	if defined adbHome cd /d %adbHome%
	::查找adb
	where adb 2>nul|findstr "exe">nul
	if !errorlevel! neq 0 (
        color c0
        echo.
        echo 找不到adb,请修改本文件的adbHome后再次运行.
        echo 任意键退出
        pause>nul
        exit
	)
	::where adb
	goto :eof